<?php
namespace Pinenut\Model2\Embedded\ReferenceContainer;

use Pinenut\Model2\Embedded\ReferenceContainer;
use Pinenut\Model2\Updaters;
use Pinenut\Model2\Embedded\Reference;
use Pinenut\Model2\Updater;
use Pinenut\Model2\Embedded;

class One extends ReferenceContainer {
	
	/**
	 * @var Reference
	 */
	protected $_container = null;
	
	public function populate($data = array(), $fromDatabase = true) {
		// населяем контейнер связбю если есть
		if (!empty($data)) {
			$reference = clone $this->_reference;
			$reference->setParent($this);
			$reference->populate($data, $fromDatabase);
			$this->_container = $reference;
		}
		if ($fromDatabase) {
			$this->_raw = $data;
		}
		
	}
	
	protected function updaters() {
// 		echo "update-one-raw:";
// 		print_r($this->_raw);
// 		echo "/update-one-raw";
		// если связь есть - генерим апдейты
		if ($this->_container instanceof Reference) {
		    /* @var $reference \Pinenut\Model2\Embedded\Reference */
            $reference = $this->_container;


			$updaters = $reference->updaters();

			foreach ($updaters as $updater) {
				/* @var $updater \Pinenut\Model2\Updater */
				$this->addUpdater($updater);
			}
		} elseif (!empty($this->_raw['_ref'])) {
			// если связи нет, но была 
			// генерим апдейт зачистки
			$updater = new Updater();
			$updater->set('', null);
			$this->addUpdater ( $updater );	

			$this->_raw = null;
		}
		// грохаем модификаторы
		// TODO: вынести в afterSave
		$updaters = $this->getUpdaters();
		$this->_updaters = new Updaters();
		return $updaters;
	}
	
	
	/**
	 *  Проверка на существование связи - для одной связи нужно проверить она ли запрашивается
	 */
	public function offsetExists($offset) {
	    return ($this->_container instanceof Reference) && $this->_container->_ref == ( string ) $offset;
	}
	/**
	 *  Удаляем связь
	 *  TODO: сделать апдейт по удалению связи
	 */
	public function offsetUnset($offset) {
	    // запускаем процедуру удаления связи
	    if (($this->_container instanceof Reference) && $this->_container->_ref == ( string ) $offset)
	        $this->_container = null;
	}
	/**
	 * Создаём новую связь или получаем существующую
	 */
	public function offsetGet($offset) {
	    $id = ( string ) $offset;
	    if (!isset($this[$offset])) {
	        if ($this->_container) {
	            unset($this[$this->_container->_ref]);
	        }
	        // добавляем связь
	        $this->_container = $this->getNewReference ( $id );
	    }
	    // возвращаем её
	    return $this->_container;
	}
	
	/**
	 * @return Reference
	 */
	public function get() {
		return $this->_container;
	}
	
	function __toString() {
		return (string)$this->_container;
	}
	
	/**
	 * @return Reference
	 */
	public function getEntity() {
		if ($this->_container instanceof Reference) {
			return $this->_container->getEntity();
		}
	}
	
	public function isEmpty() {
		return empty($this->_container) || empty($this->_container->_ref);
	}
	
	public function toArray() {
		if (method_exists ( $this->_container, 'toArray' )) {
			return $this->_container->toArray ();
		}
	}


	protected function roundEmbedded($method) {
		if (!method_exists($this, $method)) {
			return;
		} else {
			$this->$method();
		}
	
		$ref = $this->_container;
		if ($ref instanceof Embedded) {
			$ref->roundEmbedded($method);
		}
	}
	
	/**
	 * Ощищаем контейнер
	 */
	public function clean() {
		$this->_container = null;
	}
	
}